From cc7732524c035b385d6fbc1780f9541538fb4921 Mon Sep 17 00:00:00 2001 From: Jonathan Weth <git@jonathanweth.de> Date: Sun, 29 Mar 2020 17:02:32 +0200 Subject: [PATCH] Remove unnecessary old stuff from SchoolApps --- .../apps/untis/util/mysql/datetimeutils.py | 115 -------- aleksis/apps/untis/util/mysql/drive.py | 29 -- aleksis/apps/untis/util/mysql/plan.py | 247 ------------------ .../apps/untis/util/mysql/schoolapps_util.py | 53 ---- 4 files changed, 444 deletions(-) delete mode 100644 aleksis/apps/untis/util/mysql/datetimeutils.py delete mode 100644 aleksis/apps/untis/util/mysql/drive.py delete mode 100644 aleksis/apps/untis/util/mysql/plan.py delete mode 100644 aleksis/apps/untis/util/mysql/schoolapps_util.py diff --git a/aleksis/apps/untis/util/mysql/datetimeutils.py b/aleksis/apps/untis/util/mysql/datetimeutils.py deleted file mode 100644 index 698aa91..0000000 --- a/aleksis/apps/untis/util/mysql/datetimeutils.py +++ /dev/null @@ -1,115 +0,0 @@ -import datetime - -from django.utils import timezone, formats - -from schoolapps.settings import LONG_WEEK_DAYS -from untisconnect.api import TYPE_TEACHER, get_teacher_by_shortcode, TYPE_CLASS, get_class_by_name, get_all_teachers, \ - get_all_classes, get_all_rooms, get_all_subjects -from userinformation import UserInformation - - -def get_name_for_next_week_day_from_today() -> str: - """ - Return the next week day as you would say it from today: "today", "tomorrow" or "<weekday>" - :return: Formatted date - """ - # Next weekday - next_weekday: timezone.datetime = get_next_weekday_with_time(timezone.now(), timezone.now().time()) - - if next_weekday.date() == timezone.now().date(): - # Today - date_formatted = "heute" - elif next_weekday.date() == timezone.now().date() + timezone.timedelta(days=1): - # Tomorrow - date_formatted = "morgen" - else: - # Other weekday - date_formatted = LONG_WEEK_DAYS[next_weekday.isoweekday() - 1][0] - - return date_formatted - - -def get_calendar_weeks(year=timezone.datetime.now().year): - weeks = [] - - # Get first day of year > first calendar week - first_day_of_year = timezone.datetime(year=year, month=1, day=1) - if first_day_of_year.isoweekday() != 1: - days_to_next_monday = 1 - first_day_of_year.isoweekday() - first_day_of_year += datetime.timedelta(days=days_to_next_monday) - - # Go for all weeks in year and create week dict - first_day_of_week = first_day_of_year - for i in range(52): - calendar_week = i + 1 - last_day_of_week = first_day_of_week + datetime.timedelta(days=4) - weeks.append({ - "calendar_week": calendar_week, - "first_day": first_day_of_week, - "last_day": last_day_of_week - }) - first_day_of_week += datetime.timedelta(weeks=1) - - return weeks - - -def find_out_what_is_today(year=None, month=None, day=None): - date = timezone.datetime.now() - time = datetime.datetime.now().time() - if year is not None and day is not None and month is not None: - date = timezone.datetime(year=year, month=month, day=day) - if date != timezone.datetime.now(): - time = datetime.time(0) - return date, time - - -def get_calendar_week(calendar_week, year=timezone.datetime.now().year): - weeks = get_calendar_weeks(year=year) - for week in weeks: - if week["calendar_week"] == calendar_week: - return week - return None - - -def get_next_weekday(date=None): - """Get the next weekday by a datetime object""" - if date is None: - date = timezone.now().date() - - if date.isoweekday() in {6, 7}: - if date.isoweekday() == 6: - plus = 2 - else: - plus = 1 - date += datetime.timedelta(days=plus) - return date - - -def get_next_weekday_with_time(date=None, time=None) -> datetime.datetime: - """Get the next weekday by a datetime object""" - if date is None: - date = timezone.now().date() - if time is None: - time = timezone.now().time() - - if time > datetime.time(15, 35): - date += datetime.timedelta(days=1) - if date.isoweekday() in {6, 7}: - if date.isoweekday() == 6: - plus = 2 - else: - plus = 1 - date += datetime.timedelta(days=plus) - return date - - -def calendar_week(date: datetime) -> int: - return date.isocalendar()[1] - - -def weekday(date: datetime) -> int: - return date.isoweekday() - 1 - - -def format_lesson_time(time: datetime) -> str: - return formats.date_format(time, "H:i") diff --git a/aleksis/apps/untis/util/mysql/drive.py b/aleksis/apps/untis/util/mysql/drive.py deleted file mode 100644 index a576278..0000000 --- a/aleksis/apps/untis/util/mysql/drive.py +++ /dev/null @@ -1,29 +0,0 @@ -from dashboard.caches import DRIVE_CACHE, Cache -from .api import * - - -def build_drive(force_update=False): - cached = DRIVE_CACHE.get() - if cached is not False and not force_update: - print("Drive come from cache") - return cached - odrive = { - "teachers": get_all_teachers(), - "rooms": get_all_rooms(), - "classes": get_all_classes(), - "subjects": get_all_subjects(), - "corridors": get_all_corridors(), - } - - drive = {} - for key, value in odrive.items(): - drive[key] = {} - for el in value: - id = el.id - drive[key][id] = el - - DRIVE_CACHE.update(drive) - return drive - - -drive = build_drive() diff --git a/aleksis/apps/untis/util/mysql/plan.py b/aleksis/apps/untis/util/mysql/plan.py deleted file mode 100644 index 2c2c43c..0000000 --- a/aleksis/apps/untis/util/mysql/plan.py +++ /dev/null @@ -1,247 +0,0 @@ -import datetime - -from django.utils import timezone - -from dashboard import plan_caches -from schoolapps import settings -from schoolapps.settings import LESSONS -from untisconnect.api import TYPE_CLASS, TYPE_TEACHER, TYPE_ROOM -from untisconnect.api import format_classes, get_today_holidays -from untisconnect.datetimeutils import format_lesson_time -from untisconnect.events import get_all_events_by_date -from untisconnect.parse import parse -from untisconnect.sub import get_substitutions_by_date_as_dict, TYPE_CANCELLATION, generate_event_table - - -class LessonContainer(object): - """ - Needed for Django template because template language does not support dictionaries - Saves the time object and the lesson elements - """ - - def __init__(self, ): - self.time = None - self.elements = [] - - def set_time(self, time): - self.time = time - - def append(self, element): - self.elements.append(element) - - -class LessonElementContainer(object): - """ - Needed for Django template because template language does not support dictionaries - Saves the lesson element object and the room (from time object) - """ - - def __init__(self, element, room, substitution=None): - self.element = element - self.room = room - self.substitution = substitution - self.is_old = False # - - self.is_event = substitution["table"].is_event if substitution is not None else False - if self.element is not None: - self.classes_formatted = format_classes(self.element.classes) - - -def parse_lesson_times(): - times = [] - for i, t in enumerate(LESSONS): - start_split = t[0].split(":") - start_time = timezone.datetime(year=2000, day=1, month=1, hour=int(start_split[0]), minute=int(start_split[1])) - end_time = start_time + timezone.timedelta(minutes=45) - times.append({ - "number": i + 1, - "number_format": t[1], - "start": start_time, - "start_format": format_lesson_time(start_time), - "end": end_time, - "end_format": format_lesson_time(end_time) - }) - return times - - -def get_plan(type, id, smart=False, monday_of_week=None, force_update=False): - """ Generates a plan for type (TYPE_TEACHER, TYPE_CLASS, TYPE_ROOM) and a id of the teacher (class, room)""" - # Check cache - cache = plan_caches.get_cache_for_plan(type, id, smart, monday_of_week) - - cached = cache.get() - # print(cached) - if cached is not False and not force_update: - # print("Plan come from cache", cache.id) - return cached - - # Get parsed lessons - lessons = parse() - times_parsed = parse_lesson_times() - - hols_for_weekdays = [] - - if smart: - week_days = [monday_of_week + datetime.timedelta(days=i) for i in range(5)] - subs_for_weekday = [] - for week_day in week_days: - subs = get_substitutions_by_date_as_dict(week_day) - subs_for_weekday.append(subs) - - hols = get_today_holidays(week_day) - hols_for_weekdays.append(hols) - - # Init plan array - plan = [] - already_added_subs_as_ids = [] - - # Fill plan array with LessonContainers (show upside), WIDTH and HEIGHT are defined by Django settings - for hour_idx in range(settings.TIMETABLE_HEIGHT): - plan.append(([], times_parsed[hour_idx] if len(times_parsed) > hour_idx else None)) - for day_idx in range(settings.TIMETABLE_WIDTH): - plan[hour_idx][0].append(LessonContainer()) - - # Fill plan with lessons - for lesson in lessons: - for i, element in enumerate(lesson.elements): - - # Check if the lesson element is important for that plan (look by type and id) - found = False - if type == TYPE_CLASS: - for lclass in element.classes: - if lclass.id == id: - found = True - - elif type == TYPE_TEACHER: - if element.teacher: - if element.teacher.id == id: - found = True - - elif type == TYPE_ROOM: - for time in lesson.times: - for j, lroom in enumerate(time.rooms): - if lroom.id == id: - found = True - - # If the lesson element is important then add it to plan array - if found: - for time in lesson.times: # Go for every time the lesson is thought - # Find matching rooms - room_index = None - for j, lroom in enumerate(time.rooms): - if lroom.id == id: - room_index = j - - # Add the time object to the matching LessonContainer on the right position in the plan array - plan[time.hour - 1][0][time.day - 1].set_time(time) - - # Check if there is an room for this time and lesson - try: - room = time.rooms[i] - except IndexError: - room = None - - # Smart Plan: Check if there substitutions for this lesson - matching_sub = None - - if smart: - # If a sub with matching lesson id and day exists - if subs_for_weekday[time.day - 1].get(lesson.id, None) is not None: - for sub in subs_for_weekday[time.day - 1][lesson.id]: - # ... check whether the sub has the right old teacher and the right lesson number - if sub["sub"].teacher_old is not None and element.teacher is not None: - if sub["sub"].teacher_old.id == element.teacher.id and \ - sub["sub"].lesson == time.hour and sub["table"].is_event is False: - matching_sub = sub - - # If the lesson matches, add it to the list of already added subs - if matching_sub: - already_added_subs_as_ids.append(matching_sub["sub"].id) - - # Create a LessonElementContainer with room and lesson element - element_container = LessonElementContainer(element, room, substitution=matching_sub) - - # Important for rooms: Check if the current room is the old room - if smart and matching_sub is not None: - if matching_sub["sub"].room_new is not None: - if matching_sub["sub"].room_old is not None: - if matching_sub["sub"].room_old != matching_sub["sub"].room_new: - element_container.is_old = True - else: - element_container.is_old = True - - # The rooms is empty, too, if the lesson is canceled - if matching_sub["sub"].type == TYPE_CANCELLATION: - element_container.is_old = True - - # Check for holidays - if smart and hols_for_weekdays[time.day - 1]: - element_container.is_hol = True - element_container.element.holiday_reason = hols_for_weekdays[time.day - 1][0].name - - if type != TYPE_ROOM or i == room_index: - # Add this container object to the LessonContainer object in the plan array - plan[time.hour - 1][0][time.day - 1].append(element_container) - - # Now check subs which were not in this plan before - if smart: - for i, week_day in enumerate(week_days): - subs_for_this_weekday = subs_for_weekday[i] - for lesson_id, subs in subs_for_this_weekday.items(): - for sub in subs: - - found = False - room = sub["sub"].room_old - if type == TYPE_CLASS: - if sub["sub"].classes: - for _class in sub["sub"].classes: - if _class.id == id: - found = True - elif type == TYPE_TEACHER: - if sub["sub"].teacher_new: - if sub["sub"].teacher_new.id == id: - found = True - - if sub["sub"].teacher_old: - if sub["sub"].teacher_old.id == id: - found = True - - elif type == TYPE_ROOM: - if sub["sub"].room_new: - if sub["sub"].room_new.id == id: - found = True - if found: - element_container = LessonElementContainer(sub["sub"].lesson_element, room, substitution=sub) - if sub["sub"].id not in already_added_subs_as_ids: - plan[sub["sub"].lesson - 1][0][i].append(element_container) - - # Get all events for this week day - events = get_all_events_by_date(week_day) - event_table = generate_event_table(events) - - for event in event_table: - found = False - # Check if event is relevant for type and id - if type == TYPE_CLASS: - for _class in event.event.classes: - if _class.id == id: - found = True - elif type == TYPE_TEACHER: - for teacher in event.teachers: - if teacher.id == id: - found = True - - elif type == TYPE_ROOM: - for room in event.rooms: - if room.id == id: - found = True - - if found: - # Add event to plan - element_container = LessonElementContainer(None, None, - substitution={"sub": None, "table": event}) - for j in range(event.event.from_lesson - 1, event.event.to_lesson): - plan[j][0][i].append(element_container) - - cache.update((plan, hols_for_weekdays)) - return plan, hols_for_weekdays diff --git a/aleksis/apps/untis/util/mysql/schoolapps_util.py b/aleksis/apps/untis/util/mysql/schoolapps_util.py deleted file mode 100644 index 4895a34..0000000 --- a/aleksis/apps/untis/util/mysql/schoolapps_util.py +++ /dev/null @@ -1,53 +0,0 @@ -from datetime import date, time, timedelta -from typing import BinaryIO, Optional, Union -from xml.dom import Node, minidom - -from django.http import HttpRequest -from django.utils.translation import ugettext as _ - -from untisconnect.api import TYPE_TEACHER, get_teacher_by_shortcode, TYPE_CLASS, get_class_by_name, get_all_teachers, \ - get_all_classes, get_all_rooms, get_all_subjects -from untisconnect.datetimeutils import get_calendar_week, calendar_week, weekday -from untisconnect.plan import get_plan -from userinformation import UserInformation - -def get_type_and_object_of_user(user): - _type = UserInformation.user_type(user) - if _type == UserInformation.TEACHER: - # Teacher - _type = TYPE_TEACHER - shortcode = user.username - el = get_teacher_by_shortcode(shortcode) - elif _type == UserInformation.STUDENT: - # Student - _type = TYPE_CLASS - _name = UserInformation.user_classes(user)[0] - el = get_class_by_name(_name) - else: - # Nothing of both - return None, None - - return _type, el - - -def overview_dict(): - return { - 'teachers': get_all_teachers(), - 'classes': get_all_classes(), - 'rooms': get_all_rooms(), - 'subjects': get_all_subjects() - } - - -def get_plan_for_day(_type, plan_id, date): - # Get calendar week and monday of week - - monday_of_week = get_calendar_week(calendar_week(date), date.year)["first_day"] - week_day = weekday(date) - - # Get plan - plan, holidays = get_plan(_type, plan_id, smart=True, monday_of_week=monday_of_week) - lessons = [(row[week_day], time) for row, time in plan] - - holidays_for_date = holidays[week_day] - return lessons, holidays_for_date -- GitLab