aboutsummaryrefslogtreecommitdiff
path: root/crawl
diff options
context:
space:
mode:
Diffstat (limited to 'crawl')
-rw-r--r--crawl/wp.py94
1 files changed, 70 insertions, 24 deletions
diff --git a/crawl/wp.py b/crawl/wp.py
index 55d33e0..58af945 100644
--- a/crawl/wp.py
+++ b/crawl/wp.py
@@ -1,46 +1,82 @@
import json
from datetime import datetime
-# PDF courses: (SP, Name, Dozent, SWS, CP, Turnus, shortname in WebUntis)
-# Only courses with SoSe or WiSe/SoSe turnus are relevant
+# PDF courses: (SP, Name, Dozent, SWS, CP, Turnus, shortname(s) in WebUntis)
+# Source: 260806_WPF_TI_FKE_WiSe2026.pdf (Wahlpflichtmodule FK Elektrotechnik, WiSe 2026/27)
+# Full list of all modules. The last field is either a single shortname, a list
+# of shortnames (module split over several timetable entries, e.g. lecture +
+# Praktikum), or None if no matching timetable entry was found.
+# Existing shortnames were kept; new ones were looked up in timetables.json,
+# preferring the entry that actually carries scheduled dates.
PDF_COURSES = [
# Aufbau
- ("Aufbau", "Praktikum Messtechnik", "Großmann", 2, 2, "SoSe", "E-MT.PR"),
- # Automat./Robotik
+ ("Aufbau", "Elektrische Messtechnik", "Frey", 4, 5, "WiSe", "E-EMT"),
+ ("Aufbau", "Elektromagnetische Verträglichkeit (EMV)", "Stolle", 4, 5, "WiSe", "E-EMV"),
+ ("Aufbau", "Feldlehre", "Meyer", 4, 5, "WiSe", "E-ET4"),
+ ("Aufbau", "Messtechnik Praktikum", "Großmann", 2, 2, "SoSe", "E-MT.PR"),
+ # Autom./Robotik
("Autom./Robotik", "Antriebstechnik", "Meyer", 4, 5, "SoSe", "E-ANT"),
- ("Autom./Robotik", "Automatisierungstechnik 1", "Zeller / Danzer", 4, 5, "WiSe/SoSe", "E-AUT.1"),
- ("Autom./Robotik", "Praktikum Automatisierungstechnik", "Zeller / Danzer", 2, 2, "WiSe/SoSe", "E-AUT.PR"),
+ ("Autom./Robotik", "Antriebstechnik Praktikum", "Meyer", 2, 2, "WiSe", "E-ANT.PR"),
+ ("Autom./Robotik", "Automatisierungstechnik 1", "Zeller", 4, 5, "WiSe/SoSe", "E-AUT.1"),
+ ("Autom./Robotik", "Automatisierungstechnik 2", "Zeller / Danzer", 4, 5, "WiSe", "E-AUT.2"),
+ ("Autom./Robotik", "Automatisierungstechnik Praktikum", "Zeller", 2, 2, "WiSe/SoSe", "E-AUT.PR"),
("Autom./Robotik", "Robot Systems Engineering", "Dietrich", 4, 5, "SoSe", "E-RSE"),
+ ("Autom./Robotik", "Robot Systems Engineering Praktikum", "Dietrich", 2, 2, "WiSe", "E-RSE.PR"),
# Elektronik
("Elektronik", "Automobilelektronik", "Schurk", 2, 2, "WiSe/SoSe", "E-%AUTOM"),
("Elektronik", "Formula Student Electric", "Markgraf", 4, 5, "WiSe/SoSe", None),
("Elektronik", "Fortgeschrittene Messtechnik", "Großmann", 4, 5, "SoSe", "E-FMT"),
+ ("Elektronik", "IoT - Methoden der industriellen Bildverarbeitung", "Zeuke / Steyer", 2, 2, "WiSe", "E-IOT"),
+ ("Elektronik", "Mikroelektronik", "Beckmann", 4, 5, "WiSe", "E-MIKEL"),
("Elektronik", "Schaltungstechnik", "Zedler", 4, 5, "WiSe/SoSe", "E-SCHT"),
- ("Elektronik", "Elektrische Maschinen", "Meyer", 4, 5, "SoSe", "E-ELMA"),
+ ("Elektronik", "Schaltungstechnik Praktikum", "Zedler", 2, 2, "WiSe", "E-SCHT.PR"),
+ ("Elektronik", "System-on-Chip Design", "Beckmann", 4, 5, "WiSe", ["E-SOC", "E-SOC.PR"]),
# Energietechnik
+ ("Energietechnik", "Elektrische Maschinen", "Meyer", 4, 5, "SoSe", "E-ELMA"),
+ ("Energietechnik", "Elektrische Maschinen Praktikum", "Meyer", 2, 2, "WiSe", "E-ELMA.PR"),
+ ("Energietechnik", "Energiespeicher", "Schwägerl", 2, 2, "WiSe", "E-ENSP"),
+ ("Energietechnik", "Energietechnische Anlagen", "Finkel", 4, 5, "WiSe", "E-ENAN"),
("Energietechnik", "Erneuerbare Energien", "Schwägerl", 4, 5, "SoSe", "E-EREN"),
- ("Energietechnik", "Praktikum Erneuerbare Energien", "Schwägerl", 2, 2, "WiSe/SoSe", "E-EREN.PR"),
+ ("Energietechnik", "Erneuerbare Energien Praktikum", "Schwägerl", 2, 2, "WiSe/SoSe", "E-EREN.PR"),
("Energietechnik", "Hochspannungstechnik", "Finkel", 4, 5, "SoSe", "E-HST"),
+ ("Energietechnik", "Hochspannungstechnik Praktikum", "Finkel", 2, 2, "WiSe", "E-HST.PR"),
("Energietechnik", "Leistungselektronik", "Ritter", 4, 5, "SoSe", "E-LE"),
+ ("Energietechnik", "Leistungselektronik Praktikum", "Ritter", 2, 2, "WiSe", "E-LE.PR"),
+ ("Energietechnik", "Smart Grid Fundamentals", "Finkel", 2, 2, "WiSe", "E-%SGridF"),
# Information
- ("Information", "Eingebettete Echtzeitsysteme mit Praktikum", "Werthschulte", 4, 5, "SoSe", "E-EES"),
- ("Information", "Künstliche Intelligenz: Grundlagen und Anwendungen", "Legat", 4, 5, "SoSe", None),
("Information", "Digitale Zwillinge: Grundkonzepte und Anwendungen", "Legat", 4, 5, "SoSe", "E-DIGTWIN"),
+ ("Information", "Edge AI – Grundlagen und Anwendungen", "Dietrich", 2, 2, "SoSe", None),
+ ("Information", "Eingebettete Echtzeitsysteme mit Praktikum", "Werthschulte", 4, 5, "SoSe", "E-EES"),
("Information", "Industrial Security Basics", "Hollmann", 4, 5, "SoSe", "E-IS1C5"),
- ("Information", "Matlab/Simulink", "Werthschulte", 2, 2, "WiSe/SoSe", "E-MATLAB"),
+ ("Information", "Künstliche Intelligenz: Grundlagen und Anwendungen", "Legat", 4, 5, "WiSe", "E-KI"),
+ ("Information", "Matlab Simulink", "Werthschulte", 2, 2, "WiSe/SoSe", "E-%MATLAB"),
+ ("Information", "Smartphone und IoT-Sicherheit", "Werthschulte", 2, 2, "WiSe", "E-SEC"),
# Kommunikation
("Kommunikation", "Digitale Kommunikation mit Praktikum", "Kamuf", 4, 5, "SoSe", "E-DIGK"),
+ ("Kommunikation", "Entwurf moderner Kommunikationssysteme mit Praktikum", "Kamuf", 4, 5, "WiSe", ["E-EMK", "E-EMK.PR"]),
+ ("Kommunikation", "Funksysteme", "Stolle", 4, 5, "WiSe", "E-FUSYS"),
+ ("Kommunikation", "Funktechnik in der Praxis", "Bögl", 2, 2, "SoSe", "E-%FUNKT"),
("Kommunikation", "Hochfrequenz-Schaltungstechnik mit Praktikum", "Stolle", 4, 5, "SoSe", "E-HFSCH"),
("Kommunikation", "Hochfrequenzsysteme mit Praktikum", "Stolle", 4, 5, "SoSe", "E-HFSYS"),
- ("Kommunikation", "Funktechnik in der Praxis", "Bögl", 2, 2, "SoSe", None),
# Übergreifend
- ("Übergreifend", "Fertigungstechnik", "Dietrich", 4, 5, "SoSe", "E-FT"),
- ("Übergreifend", "Systems Engineering", "Frommelt", 4, 5, "WiSe/SoSe", None),
+ ("Übergreifend", "Advanced Topics in Electrical Engineering", "Gastdozierende", 2, 2, "WiSe/SoSe", None),
+ ("Übergreifend", "Amateurfunk", "Stolle / Peter", 2, 2, "WiSe/SoSe", "E-%AF"),
+ ("Übergreifend", "Betriebsorganisation", "Zeller / Tammer", 2, 2, "WiSe", "E-%BO"),
+ ("Übergreifend", "Betriebswirtschaftslehre für Ingenieure", "Finkel", 2, 2, "WiSe", "E-BWL_I"),
("Übergreifend", "Elektrokonstruktion mit E-Plan", "Danzer / Voicau-Ottlik", 2, 2, "SoSe", "E-%EPLAN"),
("Übergreifend", "Elektronikproduktion", "Dietrich / Baur", 2, 2, "SoSe", "E-EP"),
+ ("Übergreifend", "Existenzgründung", "Adam", 2, 2, "WiSe", "E-EXIGRUE"),
+ ("Übergreifend", "Fertigungstechnik", "Dietrich", 4, 5, "SoSe", "E-FT"),
+ ("Übergreifend", "Kinematik und Kinetik", "Eckert", 4, 5, "WiSe", "E-KIN"),
+ ("Übergreifend", "Multiphysics Simulation", "Frey", 2, 2, "WiSe", "E-MPHY.SIM"),
+ ("Übergreifend", "Nachhaltiges Management industrieller Produktion", "Dietrich", 2, 2, "WiSe", "E-FTN"),
+ ("Übergreifend", "Optimale Produkte und Prozesse", "Frommelt", 2, 2, "WiSe", "E-OPRO"),
+ ("Übergreifend", "Projekt \"Technische Informatik\"", "", 2, 2, "WiSe/SoSe", None),
+ ("Übergreifend", "Projektseminar \"Technische Informatik\"", "", 2, 2, "WiSe/SoSe", None),
+ ("Übergreifend", "Ringvorlesung „Energie und Ökologie\"", "Schwägerl", 2, 2, "WiSe", "E-ENOEK"),
("Übergreifend", "Systemdenken im Produktentstehungsprozess", "Königbauer", 4, 5, "SoSe", "E-THINK"),
- ("Übergreifend", "Advanced Topics in Electrical Engineering", "Gastdozierende", 2, 2, "WiSe/SoSe", None),
- ("Übergreifend", "Amateurfunk", "Stolle", 2, 2, "WiSe/SoSe", None),
+ ("Übergreifend", "Systems Engineering", "Frommelt", 4, 5, "WiSe/SoSe", None),
+ ("Übergreifend", "Zeit- und Selbstmanagement", "Manhardt", 2, 2, "SoSe", "E-ZEITM"),
]
DAY_NAMES = {
@@ -113,15 +149,25 @@ kurse = []
no_data = []
for sp, name, dozent, sws, cp, turnus, shortname in PDF_COURSES:
- semester = "WS/SS" if "WiSe/SoSe" in turnus else "SS"
-
- course_data = by_shortname.get(shortname) if shortname else None
-
- if course_data:
- slots = get_slots(course_data)
- merged = merge_slots(slots)
+ # Turnus -> Semester: WiSe/SoSe -> WS/SS, WiSe -> WS, SoSe -> SS
+ semester = {"WiSe/SoSe": "WS/SS", "WiSe": "WS", "SoSe": "SS"}[turnus]
+
+ # shortname may be a single shortname, a list of shortnames, or None.
+ # A module can have several timetable entries (e.g. lecture + Praktikum
+ # under different shortnames); we collect the slots of all of them.
+ if shortname is None:
+ shortnames = []
+ elif isinstance(shortname, (list, tuple)):
+ shortnames = list(shortname)
else:
- merged = []
+ shortnames = [shortname]
+
+ slots = []
+ for sn in shortnames:
+ course_data = by_shortname.get(sn)
+ if course_data:
+ slots.extend(get_slots(course_data))
+ merged = merge_slots(slots)
if not merged:
no_data.append(name)