From a0ed07f2c0dd27c9613d7571c8c1d5a43d8e488f Mon Sep 17 00:00:00 2001 From: 4-dash <120916864+4-dash@users.noreply.github.com> Date: Sat, 22 Nov 2025 23:49:09 +0100 Subject: [PATCH 1/4] seminar fragebogen/parser and import logic added --- src/feedback/admin.py | 3 +- .../0058_ergebnisse2025_fragebogense2025.py | 106 ++++++++++ src/feedback/models/__init__.py | 1 + src/feedback/models/fragebogenSE2025.py | 193 ++++++++++++++++++ .../parser/ergebnisse/parserSE2025.py | 73 +++++++ src/feedback/views/intern/__init__.py | 5 + src/templates/intern/import_ergebnisse.html | 11 +- 7 files changed, 389 insertions(+), 3 deletions(-) create mode 100644 src/feedback/migrations/0058_ergebnisse2025_fragebogense2025.py create mode 100644 src/feedback/models/fragebogenSE2025.py create mode 100644 src/feedback/parser/ergebnisse/parserSE2025.py diff --git a/src/feedback/admin.py b/src/feedback/admin.py index 7573f7c3..88edb873 100644 --- a/src/feedback/admin.py +++ b/src/feedback/admin.py @@ -9,7 +9,7 @@ from feedback.models import Person, Veranstaltung, Semester, \ Mailvorlage, Kommentar, Tutor, BarcodeScanner, BarcodeScannEvent, BarcodeAllowedState, \ EmailEndung, Fragebogen2020, FragebogenUE2020, Ergebnis2020, Fragebogen2016, FragebogenUE2016, Ergebnis2016, \ - Fragebogen2025, FragebogenUE2025, Ergebnis2025 + Fragebogen2025, FragebogenUE2025, Ergebnis2025, FragebogenSE2025 from feedback.models.base import Log, Fachgebiet, FachgebietEmail @@ -258,6 +258,7 @@ class FragebogenAdmin(admin.ModelAdmin): admin.site.register(Person, PersonAdmin) admin.site.register(Veranstaltung, VeranstaltungAdmin) admin.site.register(Semester, SemesterAdmin) +admin.site.register(FragebogenSE2025, FragebogenAdmin) admin.site.register(Fragebogen2025, FragebogenAdmin) admin.site.register(FragebogenUE2025, FragebogenAdmin) admin.site.register(Ergebnis2025, FragebogenAdmin) diff --git a/src/feedback/migrations/0058_ergebnisse2025_fragebogense2025.py b/src/feedback/migrations/0058_ergebnisse2025_fragebogense2025.py new file mode 100644 index 00000000..ab842401 --- /dev/null +++ b/src/feedback/migrations/0058_ergebnisse2025_fragebogense2025.py @@ -0,0 +1,106 @@ +# Generated by Django 5.2.7 on 2025-11-22 23:20 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('feedback', '0057_rename_v_7_5_ergebnis2025_v_8_1_and_more'), + ] + + operations = [ + migrations.CreateModel( + name='ErgebnisSE2025', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('anzahl', models.PositiveIntegerField()), + ('s_didaktik', models.FloatField(blank=True, null=True)), + ('s_didaktik_count', models.PositiveIntegerField(default=0)), + ('s_organisation', models.FloatField(blank=True, null=True)), + ('s_organisation_count', models.PositiveIntegerField(default=0)), + ('s_praxisbezug_motivation', models.FloatField(blank=True, null=True)), + ('s_praxisbezug_motivation_count', models.PositiveIntegerField(default=0)), + ('s_digitale_lehre', models.FloatField(blank=True, null=True)), + ('s_digitale_lehre_count', models.PositiveIntegerField(default=0)), + ('s_9_5', models.FloatField(blank=True, null=True)), + ('s_9_5_count', models.PositiveIntegerField(default=0)), + ('s_feedbackpreis', models.FloatField(blank=True, null=True)), + ('s_feedbackpreis_count', models.PositiveIntegerField(default=0)), + ('gesamt', models.FloatField(blank=True, null=True)), + ('gesamt_count', models.PositiveIntegerField(default=0)), + ('veranstaltung', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='feedback.veranstaltung')), + ], + options={ + 'verbose_name': 'Seminarergebnis 2025', + 'verbose_name_plural': 'Seminarergebnisse 2025', + 'ordering': ['veranstaltung'], + }, + ), + migrations.CreateModel( + name='FragebogenSE2025', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('fach', models.CharField(blank=True, choices=[('inf', 'Informatik'), ('math', 'Mathematik'), ('ce', 'Computational Engineering'), ('ist', 'Informationssystemtechnik'), ('etit', 'Elektrotechnik'), ('psyit', 'Psychologie in IT'), ('winf', 'Wirtschaftsinformatik'), ('sonst', 'etwas anderes')], max_length=5)), + ('abschluss', models.CharField(blank=True, choices=[('bsc', 'Bachelor'), ('msc', 'Master'), ('dipl', 'Diplom'), ('lehr', 'Lehramt'), ('sonst', 'anderer Abschluss')], max_length=5)), + ('semester', models.CharField(blank=True, choices=[('1', '1'), ('2', '2'), ('3', '3'), ('4', '4'), ('5', '5'), ('6', '6'), ('7', '7'), ('8', '8'), ('9', '9'), ('10', '>=10')], max_length=4)), + ('geschlecht', models.CharField(blank=True, choices=[('w', 'weiblich'), ('m', 'männlich'), ('s', 'sonstiges')], max_length=1)), + ('studienberechtigung', models.CharField(blank=True, choices=[('d', 'Deutschland'), ('o', 'anderes Land')], max_length=1)), + ('male_veranstaltung_gehoert', models.CharField(blank=True, choices=[('1', '1'), ('2', '2'), ('3', '3'), ('4', '<=4')], max_length=1)), + ('s_wie_oft_besucht', models.PositiveSmallIntegerField(blank=True, null=True)), + ('s_besuch_ueberschneidung', models.CharField(blank=True, choices=[('j', 'ja'), ('n', 'nein')], max_length=1)), + ('s_besuch_qualitaet', models.CharField(blank=True, choices=[('j', 'ja'), ('n', 'nein')], max_length=1)), + ('s_besuch_verhaeltnisse', models.CharField(blank=True, choices=[('j', 'ja'), ('n', 'nein')], max_length=1)), + ('s_besuch_privat', models.CharField(blank=True, choices=[('j', 'ja'), ('n', 'nein')], max_length=1)), + ('s_besuch_elearning', models.CharField(blank=True, choices=[('j', 'ja'), ('n', 'nein')], max_length=1)), + ('s_besuch_zufrueh', models.CharField(blank=True, choices=[('j', 'ja'), ('n', 'nein')], max_length=1)), + ('s_besuch_sonstiges', models.CharField(blank=True, choices=[('j', 'ja'), ('n', 'nein')], max_length=1)), + ('s_3_1', models.PositiveSmallIntegerField(blank=True, null=True)), + ('s_3_2', models.PositiveSmallIntegerField(blank=True, null=True)), + ('s_3_3', models.PositiveSmallIntegerField(blank=True, null=True)), + ('s_3_4', models.PositiveSmallIntegerField(blank=True, null=True)), + ('s_3_6', models.PositiveSmallIntegerField(blank=True, null=True)), + ('s_3_7', models.PositiveSmallIntegerField(blank=True, null=True)), + ('s_3_8', models.PositiveSmallIntegerField(blank=True, null=True)), + ('s_3_9', models.PositiveSmallIntegerField(blank=True, null=True)), + ('s_3_10', models.PositiveSmallIntegerField(blank=True, null=True)), + ('s_4_1', models.CharField(blank=True, choices=[('j', 'ja'), ('n', 'nein')], max_length=1)), + ('s_4_2', models.PositiveSmallIntegerField(blank=True, null=True)), + ('s_4_3', models.PositiveSmallIntegerField(blank=True, null=True)), + ('s_4_4', models.PositiveSmallIntegerField(blank=True, null=True)), + ('s_4_5', models.PositiveSmallIntegerField(blank=True, null=True)), + ('s_4_6', models.CharField(blank=True, choices=[('0', '0'), ('1', '0.5'), ('2', '1'), ('3', '2'), ('4', '3'), ('5', '4'), ('6', '5'), ('7', '>=5')], max_length=1)), + ('s_5_1', models.CharField(blank=True, choices=[('j', 'ja'), ('n', 'nein')], max_length=1)), + ('s_5_2', models.PositiveSmallIntegerField(blank=True, null=True)), + ('s_5_3', models.PositiveSmallIntegerField(blank=True, null=True)), + ('s_5_4', models.PositiveSmallIntegerField(blank=True, null=True)), + ('s_5_5', models.PositiveSmallIntegerField(blank=True, null=True)), + ('s_5_6', models.PositiveSmallIntegerField(blank=True, null=True)), + ('s_5_7', models.CharField(blank=True, choices=[('0', '0'), ('1', '0.5'), ('2', '1'), ('3', '2'), ('4', '3'), ('5', '4'), ('6', '5'), ('7', '>=5')], max_length=1)), + ('s_6_1', models.PositiveSmallIntegerField(blank=True, null=True)), + ('s_6_2', models.PositiveSmallIntegerField(blank=True, null=True)), + ('s_6_3', models.PositiveSmallIntegerField(blank=True, null=True)), + ('s_6_4', models.PositiveSmallIntegerField(blank=True, null=True)), + ('s_6_5', models.PositiveSmallIntegerField(blank=True, null=True)), + ('s_6_6', models.PositiveSmallIntegerField(blank=True, null=True)), + ('s_6_7', models.PositiveSmallIntegerField(blank=True, null=True)), + ('s_6_8', models.PositiveSmallIntegerField(blank=True, null=True)), + ('s_6_9', models.PositiveSmallIntegerField(blank=True, null=True)), + ('s_6_10', models.PositiveSmallIntegerField(blank=True, null=True)), + ('s_7_1', models.PositiveSmallIntegerField(blank=True, null=True)), + ('s_7_2', models.PositiveSmallIntegerField(blank=True, null=True)), + ('s_9_1', models.CharField(blank=True, choices=[('h', 'zu hoch'), ('n', 'zu niedrig')], max_length=1)), + ('s_9_2', models.CharField(blank=True, choices=[('h', 'zu hoch'), ('n', 'zu niedrig')], max_length=1)), + ('s_9_3', models.CharField(blank=True, choices=[('h', 'zu hoch'), ('n', 'zu niedrig')], max_length=1)), + ('s_9_4', models.PositiveSmallIntegerField(blank=True, null=True)), + ('s_9_5', models.PositiveSmallIntegerField(blank=True, null=True)), + ('veranstaltung', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='feedback.veranstaltung')), + ], + options={ + 'verbose_name': 'Seminarfragebogen 2025', + 'verbose_name_plural': 'Seminarfragebögen 2025', + 'ordering': ['semester', 'veranstaltung'], + }, + ), + ] diff --git a/src/feedback/models/__init__.py b/src/feedback/models/__init__.py index a763013c..2db5810b 100644 --- a/src/feedback/models/__init__.py +++ b/src/feedback/models/__init__.py @@ -14,6 +14,7 @@ from feedback.models.fragebogenUE2020 import FragebogenUE2020 from feedback.models.fragebogen2025 import Fragebogen2025, Ergebnis2025 from feedback.models.fragebogenUE2025 import FragebogenUE2025 +from feedback.models.fragebogenSE2025 import FragebogenSE2025 from django.core.exceptions import ObjectDoesNotExist from django.db.models import Q diff --git a/src/feedback/models/fragebogenSE2025.py b/src/feedback/models/fragebogenSE2025.py new file mode 100644 index 00000000..a41fb80d --- /dev/null +++ b/src/feedback/models/fragebogenSE2025.py @@ -0,0 +1,193 @@ + +# coding=utf-8 + +from django.db import models +from feedback.models import Fragebogen, Ergebnis + + +class FragebogenSE2025(Fragebogen): + fach = models.CharField(max_length=5, choices=Fragebogen.FACH_CHOICES, blank=True) + abschluss = models.CharField(max_length=5, choices=Fragebogen.ABSCHLUSS_CHOICES, blank=True) + semester = models.CharField(max_length=4, choices=Fragebogen.SEMESTER_CHOICES16, blank=True) + geschlecht = models.CharField(max_length=1, choices=Fragebogen.GESCHLECHT_CHOICES, blank=True) + studienberechtigung = models.CharField(max_length=1, choices=Fragebogen.STUDIENBERECHTIGUNG_CHOICES, blank=True) + male_veranstaltung_gehoert = models.CharField(max_length=1, choices=Fragebogen.VERANSTALTUNG_GEHOERT, blank=True) + + s_wie_oft_besucht = models.PositiveSmallIntegerField(blank=True, null=True) + s_besuch_ueberschneidung = models.CharField(max_length=1, choices=Fragebogen.BOOLEAN_CHOICES, blank=True) + s_besuch_qualitaet = models.CharField(max_length=1, choices=Fragebogen.BOOLEAN_CHOICES, blank=True) + s_besuch_verhaeltnisse = models.CharField(max_length=1, choices=Fragebogen.BOOLEAN_CHOICES, blank=True) + s_besuch_privat = models.CharField(max_length=1, choices=Fragebogen.BOOLEAN_CHOICES, blank=True) + s_besuch_elearning = models.CharField(max_length=1, choices=Fragebogen.BOOLEAN_CHOICES, blank=True) + s_besuch_zufrueh = models.CharField(max_length=1, choices=Fragebogen.BOOLEAN_CHOICES, blank=True) + s_besuch_sonstiges = models.CharField(max_length=1, choices=Fragebogen.BOOLEAN_CHOICES, blank=True) + + s_3_1 = models.PositiveSmallIntegerField(blank=True, null=True) + s_3_2 = models.PositiveSmallIntegerField(blank=True, null=True) + s_3_3 = models.PositiveSmallIntegerField(blank=True, null=True) + s_3_4 = models.PositiveSmallIntegerField(blank=True, null=True) + s_3_6 = models.PositiveSmallIntegerField(blank=True, null=True) + s_3_7 = models.PositiveSmallIntegerField(blank=True, null=True) + s_3_8 = models.PositiveSmallIntegerField(blank=True, null=True) + s_3_9 = models.PositiveSmallIntegerField(blank=True, null=True) + s_3_10 = models.PositiveSmallIntegerField(blank=True, null=True) + + s_4_1 = models.CharField(max_length=1, choices=Fragebogen.BOOLEAN_CHOICES, blank=True) + s_4_2 = models.PositiveSmallIntegerField(blank=True, null=True) + s_4_3 = models.PositiveSmallIntegerField(blank=True, null=True) + s_4_4 = models.PositiveSmallIntegerField(blank=True, null=True) + s_4_5 = models.PositiveSmallIntegerField(blank=True, null=True) + s_4_6 = models.CharField(max_length=1, choices=Fragebogen.STUNDEN_NACHBEARBEITUNG, blank=True) + + s_5_1 = models.CharField(max_length=1, choices=Fragebogen.BOOLEAN_CHOICES, blank=True) + s_5_2 = models.PositiveSmallIntegerField(blank=True, null=True) + s_5_3 = models.PositiveSmallIntegerField(blank=True, null=True) + s_5_4 = models.PositiveSmallIntegerField(blank=True, null=True) + s_5_5 = models.PositiveSmallIntegerField(blank=True, null=True) + s_5_6 = models.PositiveSmallIntegerField(blank=True, null=True) + s_5_7 = models.CharField(max_length=1, choices=Fragebogen.STUNDEN_NACHBEARBEITUNG, blank=True) + + s_6_1 = models.PositiveSmallIntegerField(blank=True, null=True) + s_6_2 = models.PositiveSmallIntegerField(blank=True, null=True) + s_6_3 = models.PositiveSmallIntegerField(blank=True, null=True) + s_6_4 = models.PositiveSmallIntegerField(blank=True, null=True) + s_6_5 = models.PositiveSmallIntegerField(blank=True, null=True) + s_6_6 = models.PositiveSmallIntegerField(blank=True, null=True) + s_6_7 = models.PositiveSmallIntegerField(blank=True, null=True) + s_6_8 = models.PositiveSmallIntegerField(blank=True, null=True) + s_6_9 = models.PositiveSmallIntegerField(blank=True, null=True) + s_6_10 = models.PositiveSmallIntegerField(blank=True, null=True) + + s_7_1 = models.PositiveSmallIntegerField(blank=True, null=True) + s_7_2 = models.PositiveSmallIntegerField(blank=True, null=True) + + s_9_1 = models.CharField(max_length=1, choices=Fragebogen.NIVEAU_CHOICES, blank=True) + s_9_2 = models.CharField(max_length=1, choices=Fragebogen.NIVEAU_CHOICES, blank=True) + s_9_3 = models.CharField(max_length=1, choices=Fragebogen.NIVEAU_CHOICES, blank=True) + s_9_4 = models.PositiveSmallIntegerField(blank=True, null=True) + s_9_5 = models.PositiveSmallIntegerField(blank=True, null=True) + + # after adding 'prize recommendation' question complete this + # s_9_ = models.CharField(max_length=1, choices=Fragebogen.BOOLEAN_CHOICES, blank=True) + + class Meta: + verbose_name = 'Seminarfragebogen 2025' + verbose_name_plural = 'Seminarfragebögen 2025' + ordering = ['semester', 'veranstaltung'] + app_label = 'feedback' + + +class ErgebnisSE2025(Ergebnis): + parts = [ + [ + 's_9_5', 'Seminar: Gesamtnote', + [ + '9.5 Welche Gesamtnote gibst du dem Seminar?', + ] + ], + [ + 's_didaktik', 'Seminar: Didaktik', + [ + '3.4 Das Seminar war eine gute Mischung aus Wissensvermittlung und Diskussion.', + '3.8 Es wurde ausreichend konstruktives Feedback gegeben.', + '3.9 Das Seminar hat mich dazu motiviert, mich weiter mit dem Thema zu beschäftigen.', + '5.3 Der Umfang der Ausarbeitungen war angemessen.', + '5.4 Während der Erstellung der Ausarbeitung gab es ausreichende Unterstützung durch die Veranstalter*innen.', + '6.3 Die Lehrkraft hat bei Problemen kompetente Unterstützung bieten können.', + '6.4 Die Lehrkraft war engagiert.', + '6.5 Die Lehrkraft ist auf studentische Fragen und Beiträge angemessen eingegangen.', + '6.6 Die Lehrkraft hat die Diskussionen gut geleitet. ', + '6.7 Die Lehrkraft regte uns gezielt zum Mitdenken und eigener Mitarbeit an.', + '6.9 Die Lehrkraft hat die Veranstaltung gut und angemessen betreut.', + ] + ], + [ + 's_organisation', 'Seminar: Organisation', + [ + '3.1 Das Seminar war inhaltlich gut strukturiert.', + '3.2 Die Organisation des Seminars war gut.', + '3.5 Für die Diskussionen der Themen war genug Zeit.', + '3.7 Es wurden ausreichend Materialien zur Verfügung gestellt.', + '4.2 Die Kriterien (Inhalt, Aufbau, Präsentation) für ein gutes Referat wurden verdeutlicht.', + '4.4 Referate waren eine sinnvolle Weise, um den Teilnehmer*innen die Inhalte zu vermitteln.', + '4.5 Die Zeitpunkte für die Referate waren gut vereinbar mit anderen Veranstaltungen und Klausurterminen.', + '5.2 Die Kriterien für eine gute Ausarbeitung wurden verdeutlicht.', + '5.6 Die Zeitpunkte für die Abgabe von Ausarbeitungen waren gut vereinbar mit anderen Veranstaltungen und Klausurterminen.', + '6.1 Die Lehrkraft hat eine gute Einführung in die Thematik gegeben.', + ] + ], + [ + 's_praxisbezug_motivation', 'Seminar: Praxisbezug und Motivation', + [ + '3.10 Durch das Seminar konnte ich meine Vortragstechnik verfeinern.', + '5.5 Durch das Anfertigen der Ausarbeitungen habe ich einen umfassenden Einblick in das Thema erhalten.', + ] + ], + [ + 's_digitale_lehre', 'Seminar: Digitale Lehre', + [ + '6.8 Die Lehrkraft setzte verfügbare Medien sinnvoll ein.', + '7.1 Ich habe ausreichend Informationen zur Nutzung des digitalen Lehr-/Lernangebots von dem/der Lehrenden erhalten.', + '7.2 Mir ist es technisch möglich, in vollem Umfang an der Veranstaltung teilzunehmen.', + ] + ], + ] + + hidden_parts = [ + [ + 's_feedbackpreis', 'Feedbackpreis: Bestes Seminar', + [ + '3.1 Das Seminar war inhaltlich gut strukturiert.', + '3.7 Es wurden ausreichend Materialien zur Verfügung gestellt.', + '3.8 Es wurde ausreichend konstruktives Feedback gegeben.', + '3.9 Das Seminar hat mich dazu motiviert, mich weiter mit dem Thema zu beschäftigen.', + '4.2 Die Kriterien (Inhalt, Aufbau, Präsentation) für ein gutes Referat wurden verdeutlicht.', + '5.4 Während der Erstellung der Ausarbeitung gab es ausreichende Unterstützung durch die Veranstalter*innen.', + '6.3 Die Lehrkraft hat bei Problemen kompetente Unterstützung bieten können.', + '6.4 Die Lehrkraft war engagiert.', + '6.7 Die Lehrkraft regte uns gezielt zum Mitdenken und eigener Mitarbeit an.', + '6.8 Die Lehrkraft setzte verfügbare Medien sinnvoll ein.', + '9.5 Welche Gesamtnote gibst du dem Seminar?', + ] + ] + ] + + weight = { + 's_feedbackpreis': [1] * 13 + [13], + } + + + # TODO: decimal statt float benutzen + s_didaktik = models.FloatField(blank=True, null=True) + s_didaktik_count = models.PositiveIntegerField(default=0) + s_didaktik_parts = ['s_3_4', 's_3_8', 's_3_9', 's_5_3', 's_5_4', 's_6_3', 's_6_4', 's_6_5', 's_6_6', 's_6_7', 's_6_7', 's_6_9',] + + s_organisation = models.FloatField(blank=True, null=True) + s_organisation_count = models.PositiveIntegerField(default=0) + s_organisation_parts = ['s_3_1', 's_3_2', 's_3_5', 's_3_7', 's_4_2', 's_4_4', 's_4_5', 's_5_2', 's_5_6', 's_6_1',] + + s_praxisbezug_motivation = models.FloatField(blank=True, null=True) + s_praxisbezug_motivation_count = models.PositiveIntegerField(default=0) + s_praxisbezug_motivation_parts = ['s_3_10', 's_5_5',] + + s_digitale_lehre = models.FloatField(blank=True, null=True) + s_digitale_lehre_count = models.PositiveIntegerField(default=0) + s_digitale_lehre_parts = ['s_6_8', 's_7_1', 's_7_2',] + + s_9_5 = models.FloatField(blank=True, null=True) + s_9_5_count = models.PositiveIntegerField(default=0) + + s_feedbackpreis = models.FloatField(blank=True, null=True) + s_feedbackpreis_count = models.PositiveIntegerField(default=0) + s_feedbackpreis_parts = [ + 's_3_1', 's_3_7', 's_3_8', 's_3_9', 's_4_2', 's_5_4', 's_6_3', 's_6_4', 's_6_7', 's_6_8', 's_9_5', + ] + + gesamt = models.FloatField(blank=True, null=True) + gesamt_count = models.PositiveIntegerField(default=0) + + class Meta: + verbose_name = 'Seminarergebnis 2025' + verbose_name_plural = 'Seminarergebnisse 2025' + ordering = ['veranstaltung'] + app_label = 'feedback' diff --git a/src/feedback/parser/ergebnisse/parserSE2025.py b/src/feedback/parser/ergebnisse/parserSE2025.py new file mode 100644 index 00000000..c93afc0a --- /dev/null +++ b/src/feedback/parser/ergebnisse/parserSE2025.py @@ -0,0 +1,73 @@ + +# coding = utf-8 + +from feedback.models import FragebogenSE2025 +from feedback.parser.ergebnisse.parser import Parser + + +class ParserSE2025(Parser): + @classmethod + def create_fragebogen(cls, veranst, frageb): + FragebogenSE2025.objects.create( + veranstaltung=veranst, + fach=cls.parse_fach_16(frageb[1]), + abschluss=cls.parse_abschluss_16(frageb[3]), + semester=cls.parse_semester_16(frageb[4]), + geschlecht=cls.parse_geschlecht_16(frageb[5]), + studienberechtigung=cls.parse_studienberechtigung(frageb[6]), + male_veranstaltung_gehoert=cls.parse_veranstaltung_gehoert(frageb[7]), + + s_wie_oft_besucht=cls.parse_int(frageb[8]), + s_besuch_ueberschneidung=cls.parse_boolean(frageb[9]), + s_besuch_qualitaet=cls.parse_boolean(frageb[10]), + s_besuch_verhaeltnisse=cls.parse_boolean(frageb[11]), + s_besuch_privat=cls.parse_boolean(frageb[12]), + s_besuch_elearning=cls.parse_boolean(frageb[13]), + s_besuch_zufrueh=cls.parse_boolean(frageb[14]), + s_besuch_sonstiges=cls.parse_boolean(frageb[15]), + + s_3_1=cls.parse_int(frageb[17]), + s_3_2=cls.parse_int(frageb[18]), + s_3_3=cls.parse_int(frageb[19]), + s_3_4=cls.parse_int(frageb[20]), + s_3_6=cls.parse_int(frageb[21]), + s_3_7=cls.parse_int(frageb[22]), + s_3_8=cls.parse_int(frageb[23]), + s_3_9=cls.parse_int(frageb[24]), + s_3_10=cls.parse_int(frageb[25]), + + s_4_1=cls.parse_boolean(frageb[26]), + s_4_2=cls.parse_int(frageb[27]), + s_4_3=cls.parse_int(frageb[28]), + s_4_4=cls.parse_int(frageb[29]), + s_4_5=cls.parse_int(frageb[30]), + s_4_6=cls.parse_extrazeit(frageb[31]), + + s_5_1=cls.parse_boolean(frageb[32]), + s_5_2=cls.parse_int(frageb[33]), + s_5_3=cls.parse_int(frageb[34]), + s_5_4=cls.parse_int(frageb[35]), + s_5_5=cls.parse_int(frageb[36]), + s_5_6=cls.parse_int(frageb[37]), + s_5_7=cls.parse_extrazeit(frageb[38]), + + s_6_1=cls.parse_int(frageb[39]), + s_6_2=cls.parse_int(frageb[40]), + s_6_3=cls.parse_int(frageb[41]), + s_6_4=cls.parse_int(frageb[42]), + s_6_5=cls.parse_int(frageb[43]), + s_6_6=cls.parse_int(frageb[44]), + s_6_7=cls.parse_int(frageb[45]), + s_6_8=cls.parse_int(frageb[46]), + s_6_9=cls.parse_int(frageb[47]), + s_6_10=cls.parse_int(frageb[48]), + + s_7_1=cls.parse_int(frageb[49]), + s_7_2=cls.parse_int(frageb[50]), + + s_9_1=cls.parse_niveau(frageb[54]), + s_9_2=cls.parse_niveau(frageb[55]), + s_9_3=cls.parse_niveau(frageb[56]), + s_9_4=cls.parse_int(frageb[57]), + s_9_5=cls.parse_int(frageb[58]), + ) diff --git a/src/feedback/views/intern/__init__.py b/src/feedback/views/intern/__init__.py index f5997981..122a0c03 100644 --- a/src/feedback/views/intern/__init__.py +++ b/src/feedback/views/intern/__init__.py @@ -477,6 +477,11 @@ def import_ergebnisse(request): warnings, errors, vcount, fbcount = parse_ergebnisse(semester, TextIOWrapper(request.FILES['file'].file, encoding='UTF-8'), f'UE{semester.fragebogen}') + elif 'typ' in request.POST and request.POST['typ'] == 'seminar': + warnings, errors, vcount, fbcount = parse_ergebnisse(semester, + TextIOWrapper(request.FILES['file'].file, encoding='UTF-8'), + f'SE{semester.fragebogen}') + else: warnings, errors, vcount, fbcount = parse_ergebnisse(semester, TextIOWrapper(request.FILES['file'].file, encoding='UTF-8')) if fbcount: diff --git a/src/templates/intern/import_ergebnisse.html b/src/templates/intern/import_ergebnisse.html index 861cc0d4..fe2e172d 100644 --- a/src/templates/intern/import_ergebnisse.html +++ b/src/templates/intern/import_ergebnisse.html @@ -16,14 +16,21 @@
{% translate "Hinweis: Die Spalten zum Feedbackpreis sind nur für Administratoren sichtbar." %}
{% endif %} +| {{ e.veranstaltung.name }} | + + {% if include_hidden_se %} {% for val, count in e.all_values %} ++ {% if count >= thresh_show %}{{ val|floatformat:1 }}{% endif %} + | + {% endfor %} {% else %} {% for val, count in e.values %} ++ {% if count >= thresh_show %}{{ val|floatformat:1 }}{% endif %} + | + {% endfor %} {% endif %} +
{% translate "Hier sind die Fragen aufgelistet, die in die einzelnen Noten einfließen." %}
+ {% for p, p_pretty, questions in parts %}