Skip to content

Commit 4b5b3d4

Browse files
committed
fragebogen/parser fix; chages to show results
1 parent a0ed07f commit 4b5b3d4

File tree

9 files changed

+240
-49
lines changed

9 files changed

+240
-49
lines changed

src/feedback/admin.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from feedback.models import Person, Veranstaltung, Semester, \
1010
Mailvorlage, Kommentar, Tutor, BarcodeScanner, BarcodeScannEvent, BarcodeAllowedState, \
1111
EmailEndung, Fragebogen2020, FragebogenUE2020, Ergebnis2020, Fragebogen2016, FragebogenUE2016, Ergebnis2016, \
12-
Fragebogen2025, FragebogenUE2025, Ergebnis2025, FragebogenSE2025
12+
Fragebogen2025, FragebogenUE2025, Ergebnis2025, FragebogenSE2025, ErgebnisSE2025
1313
from feedback.models.base import Log, Fachgebiet, FachgebietEmail
1414

1515

@@ -259,6 +259,7 @@ class FragebogenAdmin(admin.ModelAdmin):
259259
admin.site.register(Veranstaltung, VeranstaltungAdmin)
260260
admin.site.register(Semester, SemesterAdmin)
261261
admin.site.register(FragebogenSE2025, FragebogenAdmin)
262+
admin.site.register(ErgebnisSE2025, FragebogenAdmin)
262263
admin.site.register(Fragebogen2025, FragebogenAdmin)
263264
admin.site.register(FragebogenUE2025, FragebogenAdmin)
264265
admin.site.register(Ergebnis2025, FragebogenAdmin)
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Generated by Django 5.2.7 on 2025-11-30 23:29
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('feedback', '0058_ergebnisse2025_fragebogense2025'),
10+
]
11+
12+
operations = [
13+
migrations.AddField(
14+
model_name='fragebogense2025',
15+
name='s_3_5',
16+
field=models.PositiveSmallIntegerField(blank=True, null=True),
17+
),
18+
]

src/feedback/models/__init__.py

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,21 @@
1414
from feedback.models.fragebogenUE2020 import FragebogenUE2020
1515
from feedback.models.fragebogen2025 import Fragebogen2025, Ergebnis2025
1616
from feedback.models.fragebogenUE2025 import FragebogenUE2025
17-
from feedback.models.fragebogenSE2025 import FragebogenSE2025
17+
from feedback.models.fragebogenSE2025 import FragebogenSE2025, ErgebnisSE2025
1818
from django.core.exceptions import ObjectDoesNotExist
1919

2020
from django.db.models import Q
2121

2222

23-
def get_model(model, semester):
24-
mod = '%s.fragebogen%s' % (__name__, semester.fragebogen)
23+
def get_model(model, semester, is_seminar=False):
24+
if not is_seminar :
25+
mod = '%s.fragebogen%s' % (__name__, semester.fragebogen)
26+
else :
27+
mod = '%s.fragebogenSE%s' % (__name__, semester.fragebogen)
28+
29+
if is_seminar :
30+
model = model + "SE"
31+
2532
cls = '%s%s' % (model, semester.fragebogen)
2633
module = __import__(mod, fromlist=(cls,))
2734
return getattr(module, cls)
@@ -34,6 +41,15 @@ def get_model_string(model, semester):
3441
return getattr(module, cls)
3542

3643

44+
def semester_has_seminar_model(semester: Semester) :
45+
"""
46+
check if given semester has a seminar model
47+
"""
48+
SEMINAR_YEARS_LIST = ["2025",]
49+
50+
return True if semester.fragebogen in SEMINAR_YEARS_LIST else False
51+
52+
3753
def long_not_ordert():
3854
"""Alle Veranstaltungen die schon länger nicht mehr evaluiert wurden"""
3955
# suche nach allen Veranstaltungen aus dem aktellen Semester bei denen

src/feedback/models/fragebogenSE2025.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ class FragebogenSE2025(Fragebogen):
2727
s_3_3 = models.PositiveSmallIntegerField(blank=True, null=True)
2828
s_3_4 = models.PositiveSmallIntegerField(blank=True, null=True)
2929
s_3_6 = models.PositiveSmallIntegerField(blank=True, null=True)
30+
s_3_5 = models.PositiveSmallIntegerField(blank=True, null=True)
3031
s_3_7 = models.PositiveSmallIntegerField(blank=True, null=True)
3132
s_3_8 = models.PositiveSmallIntegerField(blank=True, null=True)
3233
s_3_9 = models.PositiveSmallIntegerField(blank=True, null=True)
@@ -152,9 +153,7 @@ class ErgebnisSE2025(Ergebnis):
152153
]
153154
]
154155

155-
weight = {
156-
's_feedbackpreis': [1] * 13 + [13],
157-
}
156+
weight = {} # adjust weight for ranking
158157

159158

160159
# TODO: decimal statt float benutzen

src/feedback/parser/ergebnisse/parserSE2025.py

Lines changed: 37 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -30,44 +30,45 @@ def create_fragebogen(cls, veranst, frageb):
3030
s_3_2=cls.parse_int(frageb[18]),
3131
s_3_3=cls.parse_int(frageb[19]),
3232
s_3_4=cls.parse_int(frageb[20]),
33-
s_3_6=cls.parse_int(frageb[21]),
34-
s_3_7=cls.parse_int(frageb[22]),
35-
s_3_8=cls.parse_int(frageb[23]),
36-
s_3_9=cls.parse_int(frageb[24]),
37-
s_3_10=cls.parse_int(frageb[25]),
33+
s_3_5=cls.parse_int(frageb[21]),
34+
s_3_6=cls.parse_int(frageb[22]),
35+
s_3_7=cls.parse_int(frageb[23]),
36+
s_3_8=cls.parse_int(frageb[24]),
37+
s_3_9=cls.parse_int(frageb[25]),
38+
s_3_10=cls.parse_int(frageb[26]),
3839

39-
s_4_1=cls.parse_boolean(frageb[26]),
40-
s_4_2=cls.parse_int(frageb[27]),
41-
s_4_3=cls.parse_int(frageb[28]),
42-
s_4_4=cls.parse_int(frageb[29]),
43-
s_4_5=cls.parse_int(frageb[30]),
44-
s_4_6=cls.parse_extrazeit(frageb[31]),
40+
s_4_1=cls.parse_boolean(frageb[27]),
41+
s_4_2=cls.parse_int(frageb[28]),
42+
s_4_3=cls.parse_int(frageb[29]),
43+
s_4_4=cls.parse_int(frageb[30]),
44+
s_4_5=cls.parse_int(frageb[31]),
45+
s_4_6=cls.parse_extrazeit(frageb[32]),
4546

46-
s_5_1=cls.parse_boolean(frageb[32]),
47-
s_5_2=cls.parse_int(frageb[33]),
48-
s_5_3=cls.parse_int(frageb[34]),
49-
s_5_4=cls.parse_int(frageb[35]),
50-
s_5_5=cls.parse_int(frageb[36]),
51-
s_5_6=cls.parse_int(frageb[37]),
52-
s_5_7=cls.parse_extrazeit(frageb[38]),
47+
s_5_1=cls.parse_boolean(frageb[33]),
48+
s_5_2=cls.parse_int(frageb[34]),
49+
s_5_3=cls.parse_int(frageb[35]),
50+
s_5_4=cls.parse_int(frageb[36]),
51+
s_5_5=cls.parse_int(frageb[37]),
52+
s_5_6=cls.parse_int(frageb[38]),
53+
s_5_7=cls.parse_extrazeit(frageb[39]),
5354

54-
s_6_1=cls.parse_int(frageb[39]),
55-
s_6_2=cls.parse_int(frageb[40]),
56-
s_6_3=cls.parse_int(frageb[41]),
57-
s_6_4=cls.parse_int(frageb[42]),
58-
s_6_5=cls.parse_int(frageb[43]),
59-
s_6_6=cls.parse_int(frageb[44]),
60-
s_6_7=cls.parse_int(frageb[45]),
61-
s_6_8=cls.parse_int(frageb[46]),
62-
s_6_9=cls.parse_int(frageb[47]),
63-
s_6_10=cls.parse_int(frageb[48]),
55+
s_6_1=cls.parse_int(frageb[40]),
56+
s_6_2=cls.parse_int(frageb[41]),
57+
s_6_3=cls.parse_int(frageb[42]),
58+
s_6_4=cls.parse_int(frageb[43]),
59+
s_6_5=cls.parse_int(frageb[44]),
60+
s_6_6=cls.parse_int(frageb[45]),
61+
s_6_7=cls.parse_int(frageb[46]),
62+
s_6_8=cls.parse_int(frageb[47]),
63+
s_6_9=cls.parse_int(frageb[48]),
64+
s_6_10=cls.parse_int(frageb[49]),
6465

65-
s_7_1=cls.parse_int(frageb[49]),
66-
s_7_2=cls.parse_int(frageb[50]),
67-
68-
s_9_1=cls.parse_niveau(frageb[54]),
69-
s_9_2=cls.parse_niveau(frageb[55]),
70-
s_9_3=cls.parse_niveau(frageb[56]),
71-
s_9_4=cls.parse_int(frageb[57]),
72-
s_9_5=cls.parse_int(frageb[58]),
66+
s_7_1=cls.parse_int(frageb[50]),
67+
s_7_2=cls.parse_int(frageb[51]),
68+
69+
s_9_1=cls.parse_niveau(frageb[53]),
70+
s_9_2=cls.parse_niveau(frageb[54]),
71+
s_9_3=cls.parse_niveau(frageb[55]),
72+
s_9_4=cls.parse_int(frageb[56]),
73+
s_9_5=cls.parse_int(frageb[57]),
7374
)

src/feedback/urls.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
# öffentliche Views
2626
urlpatterns += [
2727
re_path(r'^ergebnisse/(?P<vid>\d+)/$', feedback.views.public.veranstaltung, name='public-veranstaltung'),
28+
re_path(r'^ergebnisse/(?P<vid>\d+)/(?P<seminar>seminar)/$', feedback.views.public.veranstaltung, name='public-veranstaltung'),
2829
re_path(r'^ergebnisse/$', feedback.views.public.index, name='public-results'),
2930
]
3031

@@ -92,4 +93,4 @@
9293
# angezeigt werden. Im Server-Betrieb kümmert sich Apache darum.
9394
urlpatterns += [
9495
re_path(r'^d120de/(?P<tail>.*)$', feedback.views.redirect, {'redirect_to': 'http://www.d120.de/d120de/'}),
95-
]
96+
]

src/feedback/views/intern/__init__.py

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
from feedback.forms import UploadTANCSV, SendOrPDF, EMailTemplates
3030
from feedback.parser.ergebnisse import parse_ergebnisse
3131
from feedback.views import public
32-
from feedback.models import Veranstaltung, Semester, Mailvorlage, get_model, long_not_ordert, \
32+
from feedback.models import Veranstaltung, Semester, Mailvorlage, get_model, long_not_ordert, semester_has_seminar_model, \
3333
FachgebietEmail, Tutor
3434
from feedback.models.fragebogenUE2016 import FragebogenUE2016
3535
from feedback.models.fragebogenUE2020 import FragebogenUE2020
@@ -531,6 +531,7 @@ def sync_ergebnisse(request):
531531
erg = FragebogenUE2020.objects.filter(veranstaltung=v)
532532
else:
533533
erg = FragebogenUE2025.objects.filter(veranstaltung=v)
534+
534535
if len(fbs):
535536
found_something = True
536537
data = {'veranstaltung': v, 'anzahl': len(fbs)}
@@ -554,6 +555,27 @@ def sync_ergebnisse(request):
554555
data[part[0]] = result
555556
data[part[0] + '_count'] = count
556557
ergebnis.objects.create(**data)
558+
559+
# results seminar
560+
if semester_has_seminar_model(semester) :
561+
fragebogen_se = get_model('Fragebogen', semester, is_seminar=True)
562+
ergebnis_se = get_model('Ergebnis', semester, is_seminar=True)
563+
564+
ergebnis_se.objects.filter(veranstaltung__semester=semester).delete()
565+
566+
for v in Veranstaltung.objects.filter(semester=semester) :
567+
fbs = fragebogen_se.objects.filter(veranstaltung=v)
568+
569+
if len(fbs) :
570+
found_something = True
571+
data = {'veranstaltung': v, 'anzahl': len(fbs)}
572+
573+
for part in ergebnis_se.parts + ergebnis_se.hidden_parts :
574+
result, count = tools.get_average(ergebnis_se, fbs, part[0])
575+
data[part[0]] = result
576+
data[part[0] + '_count'] = count
577+
ergebnis_se.objects.create(**data)
578+
557579

558580
if not found_something:
559581
messages.warning(request, 'Für das %s liegen keine Ergebnisse vor.' % semester)

src/feedback/views/public.py

Lines changed: 55 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from django.shortcuts import get_object_or_404, render
55
from django.views.decorators.http import require_safe
66
from feedback.views.public_class_view import barcodedrop
7-
from feedback.models import Semester, get_model, Veranstaltung, Kommentar
7+
from feedback.models import Semester, get_model, Veranstaltung, Kommentar, semester_has_seminar_model
88

99
from django.conf import settings
1010

@@ -46,6 +46,7 @@ def index(request):
4646
data['parts'] = Ergebnis.parts
4747
data['include_hidden'] = False
4848

49+
4950
# Sortierung
5051
try:
5152
parts = [part[0] for part in data['parts']]
@@ -72,11 +73,62 @@ def index(request):
7273
data['order_num'] = 0
7374
data['ergebnisse'] = list(ergebnisse.order_by('veranstaltung__name'))
7475

76+
77+
if not semester_has_seminar_model(data['semester']) :
78+
data['show_seminar'] = False
79+
else :
80+
data['show_seminar'] = True
81+
82+
# Seminar Ergebnisse einlesen
83+
Ergebnis_SE = get_model('Ergebnis', data['semester'], is_seminar=True)
84+
ergebnisse_se = Ergebnis_SE.objects.filter(veranstaltung__semester=data['semester'])
85+
86+
if ergebnisse_se.exists() :
87+
data['se_exists'] = True
88+
else :
89+
data['se_exists'] = False
90+
91+
# anzuzeigende Informationen auswählen
92+
if request.user.is_superuser or settings.DEBUG == True:
93+
data['parts_se'] = Ergebnis_SE.parts + Ergebnis_SE.hidden_parts
94+
data['include_hidden_se'] = True
95+
else:
96+
data['parts_se'] = Ergebnis_SE.parts
97+
data['include_hidden_se'] = False
98+
99+
100+
# Seminar Sortierung
101+
try:
102+
parts_se = [part[0] for part in data['parts_se']]
103+
order_se = request.GET['order_se']
104+
if not order_se in parts_se:
105+
raise KeyError
106+
data['order_se'] = order_se
107+
data['order_num_se'] = parts_se.index(order_se) + 1
108+
data['ergebnisse_se'] = list(ergebnisse_se.order_by(order_se))
109+
110+
# Veranstaltung mit zu kleinen Teilnehmerzahlen bei aktuellem Kriterium nach hinten sortieren
111+
tail = []
112+
for e in data['ergebnisse_se']:
113+
count = getattr(e, order_se + '_count')
114+
if count < settings.THRESH_SHOW:
115+
tail.append(e)
116+
117+
for e in tail:
118+
data['ergebnisse_se'].remove(e)
119+
data['ergebnisse_se'].extend(tail)
120+
121+
except KeyError:
122+
data['order_se'] = 'alpha'
123+
data['order_num_se'] = 0
124+
data['ergebnisse_se'] = list(ergebnisse_se.order_by('veranstaltung__name'))
125+
126+
75127
return render(request, 'public/index.html', data)
76128

77129

78130
@require_safe
79-
def veranstaltung(request, vid=None):
131+
def veranstaltung(request, vid=None, seminar=False):
80132
# Zugangskontrolle
81133
if request.user.is_superuser or settings.DEBUG == True:
82134
authfilter = {}
@@ -92,7 +144,7 @@ def veranstaltung(request, vid=None):
92144
if data['v'].semester.sichtbarkeit != 'ALL':
93145
data['restricted'] = True
94146

95-
Ergebnis = get_model('Ergebnis', veranstaltung.semester)
147+
Ergebnis = get_model('Ergebnis', veranstaltung.semester, is_seminar=seminar)
96148
if veranstaltung.typ == 'v':
97149
parts = Ergebnis.parts_vl
98150
else:

0 commit comments

Comments
 (0)