• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

d120 / pyfeedback / 19806541863

30 Nov 2025 11:33PM UTC coverage: 88.707% (-1.0%) from 89.664%
19806541863

Pull #389

github

4-dash
fix
Pull Request #389: Seminar feedback prize

108 of 155 new or added lines in 5 files covered. (69.68%)

3 existing lines in 1 file now uncovered.

2930 of 3303 relevant lines covered (88.71%)

0.89 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

62.32
/src/feedback/models/__init__.py
1
# coding=utf-8
2

3
from feedback.models.base import Mailvorlage, Person, Semester, Veranstaltung, \
1✔
4
    Tutor, BarcodeScanner, BarcodeScannEvent, BarcodeAllowedState, Log, FachgebietEmail, Fachgebiet, \
5
    EmailEndung
6
from feedback.models.imports import ImportPerson, ImportCategory, ImportVeranstaltung
1✔
7
from feedback.models.fragebogen import Fragebogen, Ergebnis, Kommentar
1✔
8
from feedback.models.fragebogen2008 import Fragebogen2008, Ergebnis2008
1✔
9
from feedback.models.fragebogen2009 import Fragebogen2009, Ergebnis2009
1✔
10
from feedback.models.fragebogen2012 import Fragebogen2012, Ergebnis2012
1✔
11
from feedback.models.fragebogen2016 import Fragebogen2016, Ergebnis2016
1✔
12
from feedback.models.fragebogenUE2016 import FragebogenUE2016
1✔
13
from feedback.models.fragebogen2020 import Fragebogen2020, Ergebnis2020
1✔
14
from feedback.models.fragebogenUE2020 import FragebogenUE2020
1✔
15
from feedback.models.fragebogen2025 import Fragebogen2025, Ergebnis2025
1✔
16
from feedback.models.fragebogenUE2025 import FragebogenUE2025
1✔
17
from feedback.models.fragebogenSE2025 import FragebogenSE2025, ErgebnisSE2025
1✔
18
from django.core.exceptions import ObjectDoesNotExist
1✔
19

20
from django.db.models import Q
1✔
21

22

23
def get_model(model, semester, is_seminar=False):
1✔
24
    if not is_seminar :
1✔
25
        mod = '%s.fragebogen%s' % (__name__, semester.fragebogen)
1✔
26
    else :
NEW
27
        mod = '%s.fragebogenSE%s' % (__name__, semester.fragebogen)
×
28
    
29
    if is_seminar :
1✔
NEW
30
        model = model + "SE"
×
31

32
    cls = '%s%s' % (model, semester.fragebogen)
1✔
33
    module = __import__(mod, fromlist=(cls,))
1✔
34
    return getattr(module, cls)
1✔
35

36

37
def get_model_string(model, semester):
1✔
38
    mod = '%s.fragebogen%s' % (__name__, semester)
×
39
    cls = '%s%s' % (model, semester)
×
40
    module = __import__(mod, fromlist=(cls,))
×
41
    return getattr(module, cls)
×
42

43

44
def semester_has_seminar_model(semester: Semester) :
1✔
45
    """
46
    check if given semester has a seminar model
47
    """
48
    SEMINAR_YEARS_LIST = ["2025",]
1✔
49
    
50
    return True if semester.fragebogen in SEMINAR_YEARS_LIST else False
1✔
51

52

53
def long_not_ordert():
1✔
54
    """Alle Veranstaltungen die schon länger nicht mehr evaluiert wurden"""
55
    # suche nach allen Veranstaltungen aus dem aktellen Semester bei denen
56
    # die anzahl leer oder die anzahl 0 ist oder evaluieren auf false steht
57
    candidates = Veranstaltung.objects.filter(Q(semester=Semester.current()), Q(anzahl__isnull=True) | Q(anzahl__lte=0) | Q(evaluieren=False))
×
58

59
    result = []
×
60

61
    for can in candidates:
×
62
        # hole die früheren Veranstaltungen
63
        res = past_semester_orders(can)
×
64
        if res != None:
×
65
            last_result = 'Es liegen keine Ergebnisse vor'
×
66
            # Stellt die neuste Veranstaltung an erste stelle
67
            res.reverse()
×
68
            for past in res:
×
69
                # Ist aktuelle Veranstaltung nicht laenge als zwei Jahre her?
70
                jahre = 2
×
71
                if past['veranstaltung'].semester.semester >= (Semester.current().semester - (jahre * 10)):
×
72
                    # Es gab Ergebnisse
73
                    if past['anzahl_ruecklauf'] > 0:
×
74
                        break
×
75
                else:
76
                    for cord in res:
×
77
                        # suche die letzen Ergebnisse
78
                        if cord['anzahl_ruecklauf'] > 0:
×
79
                            last_result = cord['veranstaltung'].semester
×
80
                            break
×
81
                    result.append({'veranstaltung': can, 'letzte_ergebnisse': last_result, 'bestellungen': res})
×
82
                    break
×
83
        else:
84
            result.append({'veranstaltung': can, 'letzte_ergebnisse': last_result, 'bestellungen': res})
×
85
    return result
×
86

87

88
def past_semester_orders(cur_ver):
1✔
89
    """Gibt die Anzahl an Bestellungen und Rückläufern aus den früheren Semestern"""
90
    similar_lv = Veranstaltung.objects.filter(lv_nr=cur_ver.lv_nr, semester__semester__lt=cur_ver.semester.semester).order_by('-semester')
1✔
91

92
    result = []
1✔
93

94
    for onelv in similar_lv:
1✔
95
        ErgebnisModel = get_model('Ergebnis', onelv.semester)
1✔
96
        anzahl_bestellung = onelv.anzahl
1✔
97

98
        if anzahl_bestellung == None:
1✔
99
            continue
1✔
100

101
        anzahl_ruecklauf = 0
1✔
102
        try:
1✔
103
            ergebnis = ErgebnisModel.objects.get(veranstaltung=onelv)
1✔
104
            anzahl_ruecklauf = ergebnis.anzahl
1✔
105
        except ObjectDoesNotExist:
1✔
106
            pass
1✔
107

108
        result.append({'veranstaltung': onelv, 'anzahl_bestellung': anzahl_bestellung, 'anzahl_ruecklauf': anzahl_ruecklauf})
1✔
109

110
    return result
1✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc