Ejemplo n.º 1
0
def sync_ergebnisse(request):
    if request.method in ("HEAD", "GET"):
        data = {"semester": Semester.objects.all()}
        return render(request, "intern/sync_ergebnisse.html", data)

    try:
        semester = Semester.objects.get(semester=request.POST["semester"])
    except (Semester.DoesNotExist, KeyError):
        return HttpResponseRedirect(reverse("sync_ergebnisse"))

    Fragebogen = get_model("Fragebogen", semester)
    Ergebnis = get_model("Ergebnis", semester)
    Ergebnis.objects.filter(veranstaltung__semester=semester).delete()

    found_something = False
    for v in Veranstaltung.objects.filter(semester=semester):
        fbs = Fragebogen.objects.filter(veranstaltung=v)
        if len(fbs):
            found_something = True
            data = {"veranstaltung": v, "anzahl": len(fbs)}
            for part in Ergebnis.parts + Ergebnis.hidden_parts:
                result, count = tools.get_average(Ergebnis, fbs, part[0])
                data[part[0]] = result
                data[part[0] + "_count"] = count
            Ergebnis.objects.create(**data)

    if not found_something:
        messages.warning(request, u"Für das %s liegen keine Ergebnisse vor." % semester)
    else:
        messages.success(request, u"Das Ranking für das %s wurde erfolgreich berechnet." % semester)
    return HttpResponseRedirect(reverse("sync_ergebnisse"))
Ejemplo n.º 2
0
def veranstaltung(request, vid=None):
    # Zugangskontrolle
    if request.user.is_superuser or settings.DEBUG == True:
        authfilter = {}
    elif 'vid' in request.session and request.session['vid'] == int(vid):
        authfilter = {'semester__sichtbarkeit__in': ['ALL', 'VER']}        
    else:
        if not request.META['REMOTE_ADDR'].startswith('130.83.'):
            return render(request, 'public/unauth.html')
        authfilter = {'semester__sichtbarkeit': 'ALL'}
    
    veranstaltung = get_object_or_404(Veranstaltung, id=vid, **authfilter)
    data = {'v': veranstaltung}
    if data['v'].semester.sichtbarkeit != 'ALL':
        data['restricted'] = True
    
    Ergebnis = get_model('Ergebnis', veranstaltung.semester)
    if veranstaltung.typ == 'v':
        parts = Ergebnis.parts_vl
    else:
        parts = Ergebnis.parts
    ergebnis = get_object_or_404(Ergebnis, veranstaltung=veranstaltung)
    data['parts'] = zip(parts, ergebnis.values())
    data['ergebnis'] = ergebnis
    
    try:
        data['kommentar'] = Kommentar.objects.get(veranstaltung=veranstaltung)
    except Kommentar.DoesNotExist:
        pass

    return render(request, 'public/veranstaltung.html', data)
Ejemplo n.º 3
0
 def test_get_model(self):
     self.assertEqual(get_model('Fragebogen', self.s[0]), Fragebogen2008)
     self.assertEqual(get_model('Fragebogen', self.s[1]), Fragebogen2009)
     self.assertEqual(get_model('Fragebogen', self.s[2]), Fragebogen2012)
     self.assertEqual(get_model('Ergebnis', self.s[0]), Ergebnis2008)
     self.assertEqual(get_model('Ergebnis', self.s[1]), Ergebnis2009)
     self.assertEqual(get_model('Ergebnis', self.s[2]), Ergebnis2012)
Ejemplo n.º 4
0
def parse_ergebnisse(semester, csvfile):
    import csv
    from feedback.models import get_model, Veranstaltung

    parser = _get_parser(semester)
    reader = csv.reader(csvfile, delimiter=';')
    
    # Die letzte Spalte die noch zur Veranstaltung gehört. 
    # Alle diese Spalten sind gleich für jeden Fragebogen einer Veranstaltung
    grenzVeranstFragebogen = 16
    
    # Kopfzeile überspringen
    reader.next()

    # Einlesen der Zeilen der CSV-Datei
    combined = {}
    for row in reader:
        # Transkodierung iso8859-15 -> Unicode
        converted = [unicode(cell, 'iso8859-15') for cell in row]
        veranstaltung = converted[:grenzVeranstFragebogen]
        fragebogen = converted[grenzVeranstFragebogen:]
        
        # Bögen pro Veranstaltung zusammensuchen
        if veranstaltung[5] in combined:
            combined[veranstaltung[5]]['f'].append(fragebogen)
        else:
            combined[veranstaltung[5]] = {'v': veranstaltung, 'f': [fragebogen]}
            
    # Speicherung der Daten
    warnings = []
    errors = []
    vcount = 0
    fbcount = 0
    fbmodel = get_model('Fragebogen', semester)
    
    for veranst in combined.values():
        try:
            v = Veranstaltung.objects.get(name=veranst['v'][5], lv_nr=veranst['v'][6], semester=semester)
            
        except Veranstaltung.DoesNotExist:
            try:
                v = Veranstaltung.objects.get(name=veranst['v'][5], semester=semester)
                warnings.append((u'Die Veranstaltung "%s" hat in der Datenbank die ' + \
                    'Lehrveranstaltungsnummer "%s", in der CSV-Datei aber "%s". Die Ergebnisse ' + \
                    'wurden trotzdem importiert.') % (v.name, v.lv_nr, veranst['v'][6]))
                
            except Veranstaltung.DoesNotExist:
                try:
                    v = Veranstaltung.objects.get(lv_nr=veranst['v'][6], semester=semester)
                    warnings.append((u'Die Veranstaltung mit der Lehrveranstaltungsnummer "%s" hat in ' + \
                        'der Datenbank den Namen "%s", in der CSV-Datei aber "%s". Die Ergebnisse ' + \
                        'wurden trotzdem importiert.') % (v.lv_nr, v.name, veranst['v'][5]))
                    
                except Veranstaltung.DoesNotExist:
                    errors.append((u'Die Veranstaltung "%s" (%s) existiert im System nicht und ' + \
                        'wurde deshalb nicht importiert!') % (veranst['v'][5], veranst['v'][6]))
                    continue
                
        if fbmodel.objects.filter(veranstaltung=v).count():
            errors.append((u'In der Datenbank existieren bereits Fragebögen zur Veranstaltung ' + \
                          '"%s". Sie wurde deshalb nicht importiert!') % v.name)
            continue
            
        vcount += 1
        for frageb in veranst['f']:
            fbcount += 1
            parser.create_fragebogen(v, frageb)
            
    # Warnungen, Fehler, Anzahl der importierten Veranstaltungen / Fragebögen zurückgeben
    return warnings, errors, vcount, fbcount
Ejemplo n.º 5
0
def index(request):
    data = {}
    data['thresh_show'] = settings.THRESH_SHOW
    data['thresh_valid'] = settings.THRESH_VALID
    
    # Zugangskontrolle
    if request.user.is_superuser or settings.DEBUG == True:
        authfilter = {}
    else:
        if not request.META['REMOTE_ADDR'].startswith('130.83.'):
            return render(request, 'public/unauth.html')
        authfilter = {'sichtbarkeit': 'ALL'}
    
    # Semesterliste laden
    data['semester_list'] = Semester.objects.filter(**authfilter).order_by('-semester')
    if not len(data['semester_list']):
        return render(request, 'public/keine_ergebnisse.html', data)
    
    # anzuzeigendes Semester auswählen
    try:
        data['semester'] = Semester.objects.get(semester=request.GET['semester'], **authfilter)
    except (KeyError, Semester.DoesNotExist):
        data['semester'] = data['semester_list'][0]

    # Ergebnisse einlesen
    Ergebnis = get_model('Ergebnis', data['semester'])
    ergebnisse = Ergebnis.objects.filter(veranstaltung__semester=data['semester'])
    
    # anzuzeigende Informationen auswählen
    if request.user.is_superuser or settings.DEBUG == True:
        data['parts'] = Ergebnis.parts + Ergebnis.hidden_parts
        data['include_hidden'] = True
    else:
        data['parts'] = Ergebnis.parts
        data['include_hidden'] = False

    # Sortierung
    try:
        parts = [part[0] for part in data['parts']]
        order = request.GET['order']
        if not order in parts:
            raise KeyError
        data['order'] = order        
        data['order_num'] = parts.index(order)+1
        data['ergebnisse'] = list(ergebnisse.order_by(order))

        # Veranstaltung mit zu kleinen Teilnehmerzahlen bei aktuellem Kriterium nach hinten sortieren
        tail = []
        for e in data['ergebnisse']:
            count = getattr(e, order + '_count')
            if count < settings.THRESH_SHOW:
                tail.append(e)

        for e in tail:
            data['ergebnisse'].remove(e)
        data['ergebnisse'].extend(tail)

    except KeyError:
        data['order'] = 'alpha'
        data['order_num'] = 0
        data['ergebnisse'] = list(ergebnisse.order_by('veranstaltung__name'))
            
    return render(request, 'public/index.html', data)
Ejemplo n.º 6
0
def parse_ergebnisse(semester, csvfile, ueparser=None):
    import csv
    from feedback.models import get_model, get_model_string, Veranstaltung

    if ueparser is None:
        parser = _get_parser(semester)
    else:
        parser = _get_parser(semester, ueparser)

    reader = csv.reader(csvfile, delimiter=';')

    # Die letzte Spalte die noch zur Veranstaltung gehört.
    # Alle diese Spalten sind gleich für jeden Fragebogen einer Veranstaltung
    grenzVeranstFragebogen = 16

    # Kopfzeile überspringen
    next(reader)

    # Einlesen der Zeilen der CSV-Datei
    combined = {}
    for row in reader:
        converted = [str(cell) for cell in row]
        veranstaltung = converted[:grenzVeranstFragebogen]
        fragebogen = converted[grenzVeranstFragebogen:]

        # Bögen pro Veranstaltung zusammensuchen
        if veranstaltung[5] in combined:
            combined[veranstaltung[5]]['f'].append(fragebogen)
        else:
            combined[veranstaltung[5]] = {
                'v': veranstaltung,
                'f': [fragebogen]
            }

    # Speicherung der Daten
    warnings = []
    errors = []
    vcount = 0
    fbcount = 0
    if ueparser is None:
        fbmodel = get_model('Fragebogen', semester)
    else:
        fbmodel = get_model_string('Fragebogen', ueparser)

    for veranst in list(combined.values()):
        try:
            v = Veranstaltung.objects.get(name=veranst['v'][5],
                                          lv_nr=veranst['v'][6],
                                          semester=semester)

        except Veranstaltung.DoesNotExist:
            try:
                v = Veranstaltung.objects.get(name=veranst['v'][5],
                                              semester=semester)
                warnings.append(('Die Veranstaltung "%s" hat in der Datenbank die ' + \
                    'Lehrveranstaltungsnummer "%s", in der CSV-Datei aber "%s". Die Ergebnisse ' + \
                    'wurden trotzdem importiert.') % (v.name, v.lv_nr, veranst['v'][6]))

            except Veranstaltung.DoesNotExist:
                try:
                    v = Veranstaltung.objects.get(lv_nr=veranst['v'][6],
                                                  semester=semester)
                    warnings.append(('Die Veranstaltung mit der Lehrveranstaltungsnummer "%s" hat in ' + \
                        'der Datenbank den Namen "%s", in der CSV-Datei aber "%s". Die Ergebnisse ' + \
                        'wurden trotzdem importiert.') % (v.lv_nr, v.name, veranst['v'][5]))

                except Veranstaltung.DoesNotExist:
                    errors.append(('Die Veranstaltung "%s" (%s) existiert im System nicht und ' + \
                        'wurde deshalb nicht importiert!') % (veranst['v'][5], veranst['v'][6]))
                    continue

        if fbmodel.objects.filter(veranstaltung=v).count():
            errors.append(('In der Datenbank existieren bereits Fragebögen zur Veranstaltung ' + \
                          '"%s". Sie wurde deshalb nicht importiert!') % v.name)
            continue

        vcount += 1
        for frageb in veranst['f']:
            fbcount += 1
            parser.create_fragebogen(v, frageb)

    # Warnungen, Fehler, Anzahl der importierten Veranstaltungen / Fragebögen zurückgeben
    return warnings, errors, vcount, fbcount