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"))
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)
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)
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
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)
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